package myauctioneer;

import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import java.sql.Connection;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

/**
 * Applikation klasse, implementiert als static (singleton).
 * Basis Aufgaben sind Bereitstellung von applikationspezifische
 * Komponente, wie z.B. Konfiguration, Logging, Datenbank, Umgebungsfestlegung.
 * Sollte möglichst unabhängig laufen können, z.B. in Kommandozeile, ohne Serverumgebung.
 *
 * In baseDir/etc/config.properties sind standart konfigurationen festgelegt.
 * In baseDir/etc/local.properties sind lokale konfigurationen festgelegt.
 * In baseDir/var/log.txt sind alle App logging geschrieben.
 */
public class App {
	private static String baseDir;
	private static String baseUrl;
	private static Properties prop;
	private static Connection conn;
	private static Logger logger;

	/**
	 * Initialisierung von der App-Umgebung.
	 *
	 * @param baseDir Stamm verzeichniss, wo die App läuft.
	 * @param baseUrl Basis url, wo die App läufen sollte.
	 */
	public static void init(String baseDir, String baseUrl)
		throws Exception
	{
		App.baseDir = baseDir;
		App.baseUrl = baseUrl;		

		/*
		 * Initialize Properties
		 */
		File local = new File(baseDir + "/etc/local.properties");
		File config = new File(baseDir + "/etc/config.properties");

		Properties propDefault = new Properties();
		propDefault.load(new FileInputStream(config));

		App.prop = new Properties(propDefault);

		if(local.exists())
			App.prop.load(new FileInputStream(local));

		/*
		 * Initialize Database Connection
		 */
		Class.forName("oracle.jdbc.driver.OracleDriver");

		App.conn = java.sql.DriverManager.getConnection(
			App.getProperty("db.url"),
			App.getProperty("db.user"),
			App.getProperty("db.password")
		);

		/*
		 * Initialize Logger.
		 *
		 * @todo log level should be configurable via properties mechanism.
		 */
		App.logger = Logger.getLogger("myauctioneer");
		App.logger.setLevel(Level.INFO);
		FileHandler file = new FileHandler(baseDir + "/var/log.txt", true);
		file.setFormatter(new SimpleFormatter());
		App.logger.addHandler(file);
	}

	/**
	 * Stamm verzeichniss, wo die App läuft.
	 */
	public static String getBaseDir()
	{
		return App.baseDir;
	}

	/**
	 * Basis url, wo die App läufen sollte.
	 */
	public static String getBaseUrl()
	{
		return App.baseUrl;
	}

	/**
	 * Bereits konfigurierte haupt Datenbankverbindung.
	 */
	public static Connection getDb()
	{
		return App.conn;
	}

	/**
	 * Das Logger Objekt.
	 * In var/log.txt sind alle App logging geschrieben.
	 */
	public static Logger getLogger()
	{
		return App.logger;
	}

	/**
	 * Liefert eine spezifische App-Konfiguration.
	 */
	public static String getProperty(String name)
	{
		return App.prop.getProperty(name);
	}

	/**
	 * Liefert eine spezifische App-Konfiguration.
	 * Wenn sie nicht definiert ist, gibt die defaultValue zurück.
	 */
	public static String getProperty(String name, String defaultValue)
	{
		return App.prop.getProperty(name, defaultValue);
	}
}
